//
//  main.m
//  06-HomeWork
//
//  Created by dllo on 16/7/11.
//  Copyright © 2016年 daming. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    
//    计算当前时间和一个固定时间的差值,如果差值在60秒内,输出"刚刚",如果在60秒外3600秒内,输出"xx分钟前",如果3600秒外, 3600*24秒内,输出"xx小时前"
//    将字符串@"2016年04月01日 01点20分18秒"转换为NSDate对象。
//    将1468232420转成日期类型
//    研究NSDateComponents
//    预习内存管理, 整理今天的代码
#pragma mark - 计算当前时间与某固定时间的差值
    // 获取当前时间
    NSDate *date=[NSDate date];
    // 创建时区
    NSTimeZone *zone = [NSTimeZone systemTimeZone];
    // 时区差
    NSInteger interval = [zone secondsFromGMTForDate: date];
    // 当前时间
    NSDate *localeDate = [date dateByAddingTimeInterval: interval];
    // 输入一个固定时间
    NSString *setTime = @"2016-07-11 20:15:20";
    // 创建输出格式
    NSDateFormatter *format =[[NSDateFormatter alloc] init];
    // 定义输出格式
    [format setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    // 将字符串按照format 的格式转换成 NSDate类型
    NSDate *setDate = [format dateFromString: setTime];
    // 时区差
    NSInteger setInterval = [zone secondsFromGMTForDate: setDate];
    // 当前时区显示的时间
    NSDate *setDate1 = [setDate dateByAddingTimeInterval: setInterval];
    // 固定时间与当前时间之间的差值(返回的是秒)
    NSTimeInterval time = [localeDate timeIntervalSinceDate: setDate1];
    // 判断时间差值
    if (time < 60) {
        NSLog(@"刚刚");
    } else if (time < 3600 && time > 60) {
        NSLog(@"%f分钟前", time / 60);
    } else if (time < 3600 * 24 && time > 3600) {
        NSLog(@"%f小时前", time / 3600);
    }
   #pragma mark - 将字符串@"2016年04月01日 01点20分18秒"转换为NSDate对象。
    // 将字符串转换为NSDate类型
    NSString *dateStr = @"2016年04月01日 01点20分18秒";
    [format setDateFormat:@"yyyy年MM月dd日 HH点mm分ss秒"];
    NSDate *fromDate = [format dateFromString: dateStr];
    NSInteger frominterval = [zone secondsFromGMTForDate: fromDate];
    NSDate *fromDate1 = [fromDate  dateByAddingTimeInterval: frominterval];
    NSLog(@"%@", fromDate1);
    
#pragma mark - 将1468232420转成日期类型
    long long int dateTime = 1468232420;
    NSDate *dateSince2001 = [NSDate dateWithTimeIntervalSinceReferenceDate:dateTime];
    NSDate *dateSince1970 = [NSDate dateWithTimeIntervalSince1970:dateTime];
    NSDate *dateSinceNow = [NSDate dateWithTimeIntervalSinceNow:dateTime];
    NSLog(@"1970日期 = %@, 2001日期 = %@, 当前日期 = %@", dateSince1970, dateSince2001, dateSinceNow);
#pragma mark - 详解NSDatematter 和 NSDateComponents
//    NSDateFormatter调整时间格式的代码
//    在开发iOS程序时，有时候需要将时间格式调整成自己希望的格式，这个时候我们可以用NSDateFormatter类来处理。
//    例如：
    //实例化一个NSDateFormatter对象
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    
    //设定时间格式,这里可以设置成自己需要的格式
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    
    //用[NSDate date]可以获取系统当前时间
    NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];
    
    //输出格式为：2010-10-27 10:22:13
    NSLog(@"%@",currentDateStr);
  
    
//    NSDateComponents
//    NSDateComponents封装在一个可扩展的，面向对象的方式的日期组件。它是用来弥补时间的日期和时间组件提供一个指定日期：小时，分钟，秒，日，月，年，等等。它也可以用来指定的时间，例如，5小时16分钟。一个NSDateComponents对象不需要定义所有组件领域。当一个NSDateComponents的新实例被创建，日期组件被设置为NSUndefinedDateComponent。
//    一个NSDateComponents对象本身是毫无意义的;你需要知道它是针对什么日历解释，你需要知道它的值是否是正整数和值是多少。
//    获取一个NSDateComponents对象的信息
//    
//    –era 时代
//    –year 年
//    –month 月
//    –day 天
//    –hour 时
//    –minute 分
//    –second 秒
//    –week
//    –weekday
//    –weekdayOrdinal
//    –quarter 季度
//    Setting Information for an NSDateComponents Object
//        
//        设置一个NSDateComponents对象的信息
//        
//        –setEra:
//        –setYear:
//        –setMonth:
//        –setDay:
//        –setHour:
//        –setMinute:
//        –setSecond:
//        –setWeek:
//        –setWeekday:
//        –setWeekdayOrdinal:
//        –setQuarter:
//        例子如下：获得2004年5月6日是星期几
//    NSDateComponents *comps = [[NSDateComponents alloc] init];
//    [comps setDay:6];
//    [comps setMonth:5];
//    [comps setYear:2004];
//    NSCalendar *gregorian = [[NSCalendar alloc]
//                             initWithCalendarIdentifier:NSGregorianCalendar];
//    NSDate *date = [gregorian dateFromComponents:comps];
//    [comps release];
//    NSDateComponents *weekdayComponents =
//    [gregorian components:NSWeekdayCalendarUnit fromDate:date];
//    int weekday = [weekdayComponents weekday];
//    NSLog(@"%d",weekday);
//    如果需要更加详细，请查阅“Calendars, Date Components, and Calendar Units”in Date and Time Programming Guide.日期和时间的程序指南
//    
//    //一段例子：计算距离某一天还有多少时间
//    NSDate* toDate   = [[ NSDate alloc] initWithString:@"2012-9-29 0:0:00 +0600" ];
//    NSDate*  startDate  = [[ NSDate alloc] init ];
//    NSCalendar* chineseClendar = [[ NSCalendar alloc ] initWithCalendarIdentifier:NSGregorianCalendar ];
//    NSUInteger unitFlags =
//    NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit;
//    NSDateComponents *cps = [chineseClendar components:unitFlags fromDate:startDate  toDate:toDate  options:0];
//    NSInteger diffHour = [cps hour];
//    NSInteger diffMin    = [cps minute];
//    NSInteger diffSec   = [cps second];
//    NSInteger diffDay   = [cps day]; 
//    NSInteger diffMon  = [cps month]; 
//    NSInteger diffYear = [cps year]; 
//    NSLog(  @" From Now to %@, diff: Years: %d  Months: %d, Days; %d, Hours: %d, Mins:%d, sec:%d", [toDate description], diffYear, diffMon, diffDay, diffHour, diffMin,diffSec );

    return 0;
}


//+ (id)date;
//返回当前时间
//+ (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;
//返回以当前时间为基准，然后过了secs秒的时间
//+ (id)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secs;
//返回以2001/01/01 GMT为基准，然后过了secs秒的时间
//+ (id)dateWithTimeIntervalSince1970:(NSTimeInterval)secs;
//返回以1970/01/01 GMT为基准，然后过了secs秒的时间
//+ (id)distantFuture;
//返回很多年以后的未来的某一天。（比如你需要一个比现在(Now)晚(大)很长时间的时间值，则可以调用该方法。测试返回了4000/12/31 16:00:00）
//+ (id)distantPast;
//返回很多年以前的某一天。（比如你需要一个比现在(Now)早(小)大很长时间的时间值，则可以调用该方法。测试返回了公元前0001/12/31 17:00:00）
//
//用于创建NSDate实例的实例方法有
//- (id)addTimeInterval:(NSTimeInterval)secs;
//返回以目前的实例中保存的时间为基准，然后过了secs秒的时间
//
//用于初始化NSDate实例的实例方法有
//- (id)init;
//初始化为当前时间。类似date方法
//初始化为以2001/01/01 GMT为基准，然后过了secs秒的时间。类似dateWithTimeIntervalSinceReferenceDate:方法
//- (id)initWithTimeInterval:(NSTimeInterval)secs sinceDate:(NSDate *)refDate;
//初始化为以refDate为基准，然后过了secs秒的时间
//- (id)initWithTimeIntervalSinceNow:(NSTimeInterval)secs;
//初始化为以当前时间为基准，然后过了secs秒的时间
//
//2. 日期之间比较可用以下方法
//- (BOOL)isEqualToDate:(NSDate *)otherDate;
//与otherDate比较，相同返回YES
//- (NSDate *)earlierDate:(NSDate *)anotherDate;
//与anotherDate比较，返回较早的那个日期
//- (NSDate *)laterDate:(NSDate *)anotherDate;
//与anotherDate比较，返回较晚的那个日期
//- (NSComparisonResult)compare:(NSDate *)other;
//该方法用于排序时调用:
//. 当实例保存的日期值与anotherDate相同时返回NSOrderedSame
//. 当实例保存的日期值晚于anotherDate时返回NSOrderedDescending
//. 当实例保存的日期值早于anotherDate时返回NSOrderedAscending
//
//
//3. 取回时间间隔可用以下方法
//- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)refDate;
//以refDate为基准时间，返回实例保存的时间与refDate的时间间隔
//- (NSTimeInterval)timeIntervalSinceNow;
//以当前时间(Now)为基准时间，返回实例保存的时间与当前时间(Now)的时间间隔
//- (NSTimeInterval)timeIntervalSince1970;
//以1970/01/01 GMT为基准时间，返回实例保存的时间与1970/01/01 GMT的时间间隔
//- (NSTimeInterval)timeIntervalSinceReferenceDate;
//以2001/01/01 GMT为基准时间，返回实例保存的时间与2001/01/01 GMT的时间间隔
//+ (NSTimeInterval)timeIntervalSinceReferenceDate;
//以2001/01/01 GMT为基准时间，返回当前时间(Now)与2001/01/01 GMT的时间间隔
//
//
//4. 将时间表示成字符串
//- (NSString *)description;
//以YYYY-MM-DD HH:MM:SS ±HHMM的格式表示时间。（其中 "±HHMM" 表示与GMT的存在多少小时多少分钟的时区差异。比如，若时区设置在北京，则 "±HHMM" 显示为 "+0800"）
